package beanFactory;

import beanDefinitionReader.BeanDefinitionReader;
import beanDefinitionRegistry.BeanDefinitionRegistry;

import java.util.HashMap;
import java.util.Map;


//ApplicationContext接口的子实现类，用于立即加载
public abstract class AbstractApplicationContext implements ApplicationContext {
     //声明解析器变量,具体是xml解析还是什么解析，由子类决定
     protected BeanDefinitionReader beanDefinitionReader;
     //定义用于存储bean对象的map容器
    protected Map<String,Object> signletonObjects=new HashMap<>();
    //声明配置文件路径的变量
    protected String configLocation;

    //重写父类refresh方法
    @Override
    public void refresh() throws Exception {
       //加载BeanDefinition对象，并将所有BeanDefinition对象放入注册表中进行管理
        beanDefinitionReader.loadBeanDefinitions(configLocation);
      //初始化bean
        finishBeanInialLization();
    }
    //bean的初始化
    private  void finishBeanInialLization()throws Exception{
        //获取注册表对象
        BeanDefinitionRegistry registry=beanDefinitionReader.getRegistry();
        //获取BeanDefinition对象
        String[] beanNames = registry.getBeanDefinitionNames();
        //将注册表中已有的BeanDefinition对象，全部通过反射创建对象后，放入IOC容器中
        //进行bean的初始化方法
        for (String beanName : beanNames) {
            //调用父类的getBean方法，获取对应的bean对象
            //getBean方法的具体实现，有对应的子类完成
            //getBean对应的子类实现方式，会有区别，例如ClassPathXmlApplicationContext重写getBean方法
            //里面逻辑主要是读取xml，而如果是其他方式创建子类，那么getBean重写的逻辑也会有区别
          getBean(beanName);
        }
    }
}
